package com.echo.im.client.status;


import com.echo.im.client.model.IMTerminalType;
import com.echo.im.client.model.IMUserInfo;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 在线状态服务接口
 * 该接口提供了一系列方法来查询和管理用户的在线状态
 * 主要功能包括获取用户所在服务器ID及其终端类型列表、用户信息列表，
 * 以及判断用户是否在线等
 *
 * @author echo
 */
public interface UserStatusService {

    /**
     * 根据用户ID和终端类型列表，获取用户所在服务器ID及其终端类型列表的映射
     *
     * @param userId 用户ID
     * @param terminals 终端类型列表
     * @return 服务器ID与终端类型列表的映射
     */
    Map<Integer, List<Integer>> getServerIdTerminalListMap(Long userId, List<Integer> terminals);

    /**
     * 根据用户ID列表，获取用户所在服务器ID及其用户信息列表的映射
     *
     * @param userIds 用户ID列表
     * @return 服务器ID与用户信息列表的映射
     */
    Map<Integer, List<IMUserInfo>> getServerIdUserInfoListMap(List<Long> userIds);

    /**
     * 根据用户ID列表，获取用户ID与其终端类型列表的映射
     *
     * @param userIds 用户ID列表
     * @return 用户ID与终端类型列表的映射
     */
    Map<Long, List<IMTerminalType>> getUserIdTerminalListMap(List<Long> userIds);

    /**
     * 判断用户是否在线
     *
     * @param userId 用户ID
     * @return 用户是否在线，在线返回true，否则返回false
     */
    Boolean isUserOnline(Long userId);

    /**
     * 根据用户ID列表，获取在线用户的用户ID列表
     *
     * @param userIds 用户ID列表
     * @return 在线用户的用户ID列表
     */
    List<Long> getOnlineUserIdList(List<Long> userIds);

    /**
     * 根据接收者ID列表和离线用户ID集合，获取服务器ID及其用户信息列表的映射，然后对离线用户用户列表进行填充
     *
     * @param recvIds 接收者ID列表
     * @param offlineUserIdList 离线用户ID集合
     * @return 服务器ID与用户信息列表的映射，包括离线用户
     */
    Map<Integer, List<IMUserInfo>> getServerIdUserInfoListMapWithOffline(List<Long> recvIds, Set<Long> offlineUserIdList);
}
